<?php

function Recover($c){
	file_put_contents('./recover',$c);
}


function get_user_browser()
{
    if (empty($_SERVER['HTTP_USER_AGENT']))
    {
        return '';
    }
  
    $agent       = $_SERVER['HTTP_USER_AGENT'];
    $browser     = '';
    $browser_ver = '';
  
    if (preg_match('/MSIE\s([^\s|;]+)/i', $agent, $regs))
    {
        $browser     = 'Internet Explorer';
        $browser_ver = $regs[1];
    }
    elseif (preg_match('/FireFox\/([^\s]+)/i', $agent, $regs))
    {
        $browser     = 'FireFox';
        $browser_ver = $regs[1];
    }
    elseif (preg_match('/Maxthon/i', $agent, $regs))
    {
        $browser     = '(Internet Explorer ' .$browser_ver. ') Maxthon';
        $browser_ver = '';
    }
    elseif (preg_match('/Opera[\s|\/]([^\s]+)/i', $agent, $regs))
    {
        $browser     = 'Opera';
        $browser_ver = $regs[1];
    }
    elseif (preg_match('/OmniWeb\/(v*)([^\s|;]+)/i', $agent, $regs))
    {
        $browser     = 'OmniWeb';
        $browser_ver = $regs[2];
    }
    elseif (preg_match('/Netscape([\d]*)\/([^\s]+)/i', $agent, $regs))
    {
        $browser     = 'Netscape';
        $browser_ver = $regs[2];
    }
    elseif (preg_match('/safari\/([^\s]+)/i', $agent, $regs))
    {
        $browser     = 'Safari';
        $browser_ver = $regs[1];
    }
    elseif (preg_match('/NetCaptor\s([^\s|;]+)/i', $agent, $regs))
    {
        $browser     = '(Internet Explorer ' .$browser_ver. ') NetCaptor';
        $browser_ver = $regs[1];
    }
    elseif (preg_match('/Lynx\/([^\s]+)/i', $agent, $regs))
    {
        $browser     = 'Lynx';
        $browser_ver = $regs[1];
    }
  
    if (!empty($browser))
    {
       return addslashes($browser . ' ' . $browser_ver);
    }
    else
    {
        return 'Unknow browser';
    }
}

/*
	###用户文件下载
	参一：当前用户名
	参二：文件路径(非全路径,后续会处理)
*/
function DownloadFile($user,$path){
		$res = get_user_browser();
		$vname = substr($path,strripos($path,'/')+1);
		if(!$user ||!$path){
			exit('err2');
		}
		$file_name = GetFullPath($user,$path);
		if(GetSystemType() == 'windows'){
			$file_name = iconv('utf-8','gbk',$file_name);
		}
		if(!file_exists($file_name)){
			exit('err3');
		}
		$fp = fopen($file_name,'r');	//打开这个文件
		$file_size=filesize($file_name);	//读取这个文件的大小
		header("Content-Type: application/octet-stream"); //设置下载文件类型
		header("Content-Ranges: bytes");		//设置字节类型（字节）
		header("Content-Length: $file_size");		//设置下载文件的大小
		header("Content-Disposition: attchment; filename=".$vname); //设置文件名，可指定！
		$buffer=1024;	//设置文件下载时每次读取量的大小。
		while(!feof($fp)){	//如果文件没有读取结束
			$file_data=fread($fp,$buffer);	//当前读取量是多少
			echo "$file_data";	//把当前读取量返回给页面
		}	
		fclose($fp);	//下载完成，关闭文件。
		exit;
}



//生成并获取token1
function GetToken1($user,$type=false){
	$token = md5($user.$_SERVER['REMOTE_ADDR'].microtime());
	if(!$type){	//前台
		$tname = 'token1';
	}else{		//后台
		$tname = 'admin_token1';
	}

	return $_SESSION[$tname] = $token;
}



//检测token1,并返回新token1
function CheckToken1($user,$token1,$type=false){
	//echo $_SESSION['token1'].'-----'.$token1;
	if(!$type){		//前台
		$token1_s = $_SESSION['token1'];
	}else{			//后台
		$token1_s = $_SESSION['admin_token1'];
	}
	if($token1_s == $token1){
		return GetToken1($user,$type);
	}else{
		return false;
	}
}




/*
	###	获取组合后的文件存储全路径
	参一：用户名
	参二：文件存储路径（未组合的非全路径）
*/
function GetFullPath($user,$path){
	return $full_path = './data/data/user_'.$user.$path;
}




/*
	### 检测请求是否同源
	return 同源返回true,异源返回false
		注：由于referer可伪造，故该验证可信度不高
*/
function CheckOrigin(){
	if(!@$_SERVER['HTTP_REFERER'] || !stripos($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST']) ){
		return false;
	}else{
		return true;
	}
}






/*
	### 缩放图片
	参一：图片资源名
	参二：设置等比缩放的最大高度，默认300px
	参三：设置等比缩放的最大宽度，默认300px
	返回：缩放成功会返回 jpg格式的文件名
	示例：
		$new_name = ScaleImg($_FILES['banner']["tmp_name"]);
*/
function ScaleImg($imgs,$nw=300,$nh=300,$new_name = false){
	if(!is_array($imgs)){
		exit('err11');
	}
	$ext = pathinfo($imgs['name'],PATHINFO_EXTENSION);
	switch($ext){
		case 'jpg':case 'JPG':case 'jpeg':case 'JPEG':
			$oimg=imagecreatefromjpeg($imgs['tmp_name']);	//引入要绽放的图片
			break;
		case 'png':case 'PNG':
			$oimg=imagecreatefrompng($imgs['tmp_name']);	//引入要绽放的图片
			break;
		case 'gif':case 'GIF':
			$oimg=imagecreatefromgif($imgs['tmp_name']);	//引入要绽放的图片
			break;
	}

	$ow=imagesx($oimg);		//获取要缩放图片的高宽
	$oh=imagesy($oimg);
	if(!$new_name){
		$new_name = 'a_'.ceil($imgs['size'] / 1024).'k.jpg';
	}
	if($nw==0 || $nh==0){
		imagejpeg($oimg,$new_name);		//保存图片
	}else{
		if($ow && ($ow <$oh)){			//按公式将预设的宽高进行缩小并得到缩小后的值
			$nw=($nh / $oh) * $ow;
		}else{
			$nh=($nw / $ow) * $oh;
		}
		$nimg=imagecreatetruecolor($nw,$nh);	//创建一个画布，高宽使用缩放后的值，
		imagecopyresampled($nimg,$oimg,0,0,0,0,$nw,$nh,$ow,$oh);	//用函数将图片缩放
		imagejpeg($nimg,$new_name);		//保存图片
		imagedestroy($nimg);			//关闭资源
	}
	imagedestroy($oimg);
	return $new_name;
}










/*
	### GET方式Curl获取远程资源
	参一：$ourl (string)   请求地址
	return  (string) 	返回的结果
	示例：
		$res2 = CurlForGet($ourl);
*/
function CurlForGet($ourl){
	$curlobj = curl_init($ourl);
	curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,true);
	curl_setopt($curlobj,CURLOPT_SSL_VERIFYPEER, 0);
	$output = curl_exec($curlobj);	
	curl_close($curlobj);
	return $output;
}



	
















//打印信息
function dump($data,$stat=false){
	echo '<pre>';
		var_dump($data);
	echo '</pre>';
	if($stat){
		exit;
	}
}




/*
	###  获取指定日期的年月日当天零时的时间戳
		参一：$tag 获取哪天的的标记 如：要获取昨天的'-1 day'

		示例：
			echo $a = GetDateYmd('-1 day');		//1525968000
			echo date('Y-m-d H:i:s',$a);		//2018-05-11 00:00:00

*/
function GetDateYmd($tag){
	return strtotime(date('Y-m-d',strtotime($tag,time())));
}













/*
	### 检测并替换字串中的特殊字符为实体字符 (' , " , > , < , / , \)
	### 参一：源字串 
	### 参二：是否反解析，默认false为特殊字符转实体
	### 参三：不参与替换的字符,默认为空
	### return : 返回替换后的字串
	### 示例：
		$b = ChangeChar($a);	//转实体
		$val2 = ChangeChar($val,1); //实体转字符
*/
function ChangeChar($val,$stat=false,$sign=''){
	if($stat){
		$p = '/&#60/';
		$val = preg_replace($p,"<",$val);
		$p = '/&#62/';
		$val = preg_replace($p,">",$val);
		$p = '/&#39/';
		$val = preg_replace($p,"'",$val);
		$p = '/&#34/';
		$val = preg_replace($p,'"',$val);
		if($sign != '/'){
			$p = '/&#47/';
			$val = preg_replace($p,"/",$val);
		}
		$p = '/&#92/';
		$val = preg_replace($p,"\\",$val);
		$p = '/&#59/';
		$val = preg_replace($p,";",$val);

		$p = '/&#40/';
		$val = preg_replace($p,"(",$val);

		$p = '/&#41/';
		$val = preg_replace($p,")",$val);

		//$p = '/&nbsp/';
		//$val = preg_replace($p," ",$val);
		return $val;
	}else{
		$p ='/</';
		$val = preg_replace($p,"&#60",$val);
		$p ='/>/';
		$val = preg_replace($p,"&#62",$val);
		$p ="/'/";
		$val = preg_replace($p,"&#39",$val);
		$p ='/"/';
		$val = preg_replace($p,"&#34",$val);
		if($sign != '/'){
			$p = '/\//';
			$val = preg_replace($p,"&#47",$val);
		}
		$p = '/\\\/';
		$val = preg_replace($p,"&#92",$val);
		$p = '/;/';
		$val = preg_replace($p,"&#59",$val);

		$p = '/\(/';
		$val = preg_replace($p,"&#40",$val);
		$p = '/\)/';
		$val = preg_replace($p,"&#41",$val);
		
		//$p = '/\s/';
		//$val = preg_replace($p,"&nbsp",$val);
		return $val;
	}
}





/*
	### 接收POST,GET,REQUEST数据，并处理特殊字符
	参一：接收名
	参二：默认空为get方式，get|post|all (request)
	return：返回将特殊字符处理后的数据
	示例：
		$number = I('number','post');
*/
function I($name,$type=''){
	switch($type){
		case 'p':$val = @$_POST[$name];break;
		case 'g':$val = @$_GET[$name];break;
		default:$val = @$_REQUEST[$name];break;
	}
	return trim($val);
}





/*
	### 永久缓存或读取数据
	参一：缓存路径 (string)
	参二：缓存的值（string）
	return：
		当只有参一时是获取缓存并返回空或对应的值
		当有两个参数时是设置缓存，无返回值
	示例：
		S('a','aaa');	//设置
		echo S('a');	//获取
*/
function S($p,$v=false){
	if($v === ''){
		if(is_file($p)){
			unlink($p);
		}
		return;
	}
	if($v !== false){
		if(!is_dir(dirname($p))){
			Mkdirs(dirname($p));
		}
		file_put_contents($p,$v);
	}else{
		if(!file_exists($p)){
			return;
		}
		return file_get_contents($p);
	}
}





/*
	### 递归创建目录
	### 参一：目录路径
*/
function Mkdirs($p){
	if(!is_dir($p)){
		Mkdirs(dirname($p));
		mkdir($p,0777,true);
	}
}




//递归删除目录及文件
function DelDirs($p){
	if(is_file($p)){
		unlink($p);
	}
	if(is_dir($p)){
		$op = opendir($p);
		while($rd = readdir($op)){
			if($rd == '.' || $rd == '..'){
				continue;
			}
			$p2 = $p.'/'.$rd;
			DelDirs($p2);
		}
		rmdir($p);
		closedir($op);
	}
}



/*
	### 将字节转换成相应的单位(KB,MB,GB,TB)
	参一：字节大小数值
	返回：返回相应的KB,MB,GB,TB数值和单位
	示例：
		$size = filesize('1.i');
		echo trans_byte($size);	// 1.09GB
*/
function trans_byte($byte){
    $KB = 1024;
    $MB = 1024 * $KB;
    $GB = 1024 * $MB;
    $TB = 1024 * $GB;
    if ($byte < $KB) {
        return $byte . "B";
    } elseif ($byte < $MB) {
        return round($byte / $KB, 2) . "KB";
    } elseif ($byte < $GB) {
        return round($byte / $MB, 2) . "MB";
    } elseif ($byte < $TB) {
        return round($byte / $GB, 2) . "GB";
    } else {
        return round($byte / $TB, 2) . "TB";
    }
}


//获取目录中文件总大小
function dirSize($dir){	
	$op=opendir($dir);
	$count=0.0;
	while($rd=readdir($op)){
		if($rd=='.' || $rd=='..'){
			continue;
		}
		$path=$dir.'/'.$rd;
		if(is_dir($path)){
			$count += dirsize($path);
		}else{
			$size = filesize($path);	//小文件累加
			if($size < 1904730996){
				$count += $size;
			}else{
				$path2 = 'http://'.$_SERVER['SERVER_NAME'].'/'.$path;	//大文件累加
				$count += get_headers($path2,true)["Content-Length"];
			}
		}
	}
	closedir($op);					//关闭目录资源
	return $count;					//向函数返回计数变量
}








/*
	### 获取系统类型是window还是linux
	返回 wdinows 或 linux
*/
function GetSystemType(){
	$kernel = php_uname();
	if(preg_match('/^Linux/',$kernel)){
		return 'linux';
	}
	if(preg_match('/^Windows/',$kernel)){
		return 'windows';
	}
}
